﻿#define _CRT_SECURE_NO_WARNINGS 1

//#include <string>
#include <iostream>
using namespace std;
//
//class Person
//{
//public:
//	void Print()
//	{
//		cout << "name:" << _name << endl;
//		cout << "age:" << _age << endl;
//	}
//protected:
//	string _name = "peter"; // 姓名
//	int _age = 18; // 年龄
//};
//
//class Student : public Person
//{
//protected:
//	int _stuid; // 学号
//};
//
//class Teacher : public Person
//{
//protected:
//	int _jobid; // 工号
//};
//
//int main()
//{
//	Student s;
//	Teacher t;
//	s.Print();
//	t.Print();
//	return 0;
//}

//class Person
//{
//public:
//	Person(const char* name = "peter")
//		: _name(name)
//	{
//		cout << "Person()" << endl;
//	}
//
//	Person(const Person& p)
//		: _name(p._name)
//	{
//		cout << "Person(const Person& p)" << endl;
//	}
//
//	Person& operator=(const Person & p)
//	{
//		cout << "Person operator=(const Person& p)" << endl;
//		if (this != &p)
//			_name = p._name;
//
//		return *this;
//	}
//
//	~Person()
//	{
//		cout << "~Person()" << endl;
//	}
//
//	void Print()
//	{
//		cout << _name << endl;
//	}
//
//protected:
//	string _name; // 姓名
//public:
//	static int _count;//统计人数
//};
//int Person::_count = 0;
//
////在子类中
////属于父类的成员会调用父类的构造函数完成初始化，故所有父类必须要把默认构造函数写出来
////
//class Student : public Person
//{
//public:
//	Student(const char* name)
//		:Person(name)//必须调用父类的构造函数
//		, _stuid(20230101)
//		,_address("西安")
//	{
//		cout << "Student()" << endl;
//	}
//	//拷贝构造函数
//	Student(const Student& stu)//假设存在深拷贝，就要显式写出拷贝构造函数
//		:Person(stu)//直接拿子类对象给父类完成拷贝构造
//		, _stuid(stu._stuid)
//	{
//		cout << "Student(const Student& stu)" << endl;
//	}
//	//赋值构造函数
//	Student& operator=(const Student& stu)
//	{
//		if (this != &stu)
//		{
//			Person::operator=(stu);//显式调用父类的赋值构造函数（父类和子类的构成隐藏关系）
//			_stuid = stu._stuid;//子类的成员变量
//		}
//		cout << "operator=(const Student& stu)" << endl;
//		return *this;
//	}
//	~Student()
//	{
//		cout << "~Student()" << endl;
//	}
//protected:
//	int _stuid; //学号
//	string _address;
//};

//void Test()
//{
//	Student s1("jack");
//	Student s2(s1);
//	Student s3("rose");
//	s1 = s3;
//}

//int main()
//{
//	Test();
//
//	Person* p = nullptr;
//	p->Print();
//	p->_count;
//	(*p).Print();
//	(*p)._count;
//
//	return 0;
//}


//	template<typename Type>
//	Type Max(const Type& a, const Type& b)
//	{
//		cout << "This is Max<Type>" << endl;
//		return a > b ? a : b;
//	}
//	template<>
//	int Max<int>(const int& a, const int& b)
//	{
//		cout << "This is Max<int>" << endl;
//		return a > b ? a : b;
//	}
//	template<>
//	char Max<char>(const char& a, const char& b)
//	{
//		cout << "This is Max<char>" << endl;
//		return a > b ? a : b;
//	}
//
//	int Max(const int& a, const int& b)
//	{
//		cout << "This is Max" << endl;
//		return a > b ? a : b;
//	}
//
//int main()
//{
//	Max(10, 20);
//	Max(12.34, 23.45);
//	Max('A', 'B');
//	Max<int>(20, 30);
//	return 0;
//}

class A
{
public:
	int _a;
};
class B: public A
{
public:
	int _b;
};
class C : public A
{
public:
	int _c;
};
class D : public B, public C
{
public:
	int _d;
};
int main()
{
	D d;
	d.B::_a = 1;
	d.C::_a = 2;
	d._b = 3;
	d._c = 4;
	d._d = 5;
	return 0;
}